.TH std::extents::extents 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::extents::extents \- std::extents::extents

.SH Synopsis
   constexpr extents() = default;                                     \fB(1)\fP (since C++23)
   template< class OtherIndexType, std::size_t... OtherExtents >

   constexpr explicit(/*see below*/)                                  \fB(2)\fP (since C++23)

       extents( const std::extents<OtherIndexType, OtherExtents...>&
   other ) noexcept;
   template< class... OtherIndexTypes >                               \fB(3)\fP (since C++23)
   constexpr explicit extents( OtherIndexTypes... exts ) noexcept;
   template< class OtherIndexType, std::size_t N >

   constexpr explicit(N != rank_dynamic())                            \fB(4)\fP (since C++23)

       extents( std::span<OtherIndexType, N> exts ) noexcept;
   template< class OtherIndexType, std::size_t N >

   constexpr explicit(N != rank_dynamic())                            \fB(5)\fP (since C++23)

       extents( const std::array<OtherIndexType, N>& exts ) noexcept;

   Construct an extents. One can construct extents from just dynamic extents, which are
   all the values getting stored, or from all the extents with a precondition.

   1) Default constructor. Initializes all dynamic extents to zero.
   2) Conversion from another extents object. After construction, *this == other is
   true.
     * The behavior is undefined if

     * other.extent(r) != static_extent(r) for any r for which static_extent(r)
       represents a static extent, or
     * other.extent(r) is not representable as a value of type IndexType for any rank
       value r in other.
     * This overload participates in overload resolution only if

     * sizeof...(OtherExtents) == rank() is true, and
     * ((OtherExtents == std::dynamic_extent || Extents == std::dynamic_extent ||
         OtherExtents == Extents) && ...) is true.
     * This constructor is explicit if

     * ((Extents != std::dynamic_extent && OtherExtents == std::dynamic_extent) || ...)
       is true, or
     * std::numeric_limits<IndexType>::max() <
       std::numeric_limits<OtherIndexType>::max() is true.
   3) Let N be sizeof...(exts) and exts_arr be std::array<IndexType,
   N>{static_cast<IndexType>(std::move(exts))...}, equivalent to extents(exts_arr).
     * This overload participates in overload resolution only if

     * (std::is_convertible_v<OtherIndexTypes, IndexType> && ...) is true,
     * (std::is_nothrow_constructible_v<IndexType, OtherIndexTypes> && ...) is true,
       and
     * N == rank_dynamic() || N == rank() is true.
     * The behavior is undefined if

     * N != rank_dynamic() and exts_arr[r] is not equal to static_extent(r) for any r
       for which static_extent(r) represents a static extent, or
     * an element in exts is negative or not representable as a value of type
       IndexType.
   4,5) If N equals rank_dynamic(), for all d in [0, rank_dynamic()),
   direct-non-list-initializes dynamic-extents[d] with std::as_const(exts[d]).
   Otherwise, for all d in [0, rank_dynamic()), direct-non-list-initializes
   dynamic-extents[d] with std::as_const(exts[dynamic-index-inv(d)]).
     * This overload participates in overload resolution only if

     * std::is_convertible_v<const OtherIndexType&, IndexType> is true,
     * std::is_nothrow_constructible_v<IndexType, const OtherIndexType&> is true, and
     * N == rank_dynamic() || N == rank() is true.
     * The behavior is undefined if

     * N != rank_dynamic() and exts[r] is not equal to static_extent(r) for any r for
       which static_extent(r) represents a static extent, or
     * exts[r] is negative or not representable as a value of type IndexType for any
       rank index r.

.SH Parameters

   other - another extents to convert from
   exts  - represents the extents

.SH Example

    This section is incomplete
    Reason: no example

.SH See also

    This section is incomplete

.SH Categories:
     * Todo no example
     * Todo without reason
